import 'package:get/get.dart';
import '../models/chat_message.dart';
import '../config/api_config.dart';
import 'dart:convert';
import 'package:http/http.dart' as http;

class ChatController extends GetxController {
  final RxList<ChatMessage> messages = <ChatMessage>[].obs;
  final RxString selectedTopic = '找话题'.obs;
  final RxString inputText = ''.obs;
  final RxBool isLoading = false.obs;
  final RxBool useJsonMode = true.obs; // 默认使用JSON模式
  final RxString selectedModel = 'qwen-plus'.obs; // 当前选中的模型

  // 可用模型列表
  final List<Map<String, String>> availableModels = [
    {'value': 'qwen-plus', 'name': 'Qwen Plus'},
    {'value': 'qwen-turbo', 'name': 'Qwen Turbo'},
    {'value': 'qwen-max', 'name': 'Qwen Max'},
    {'value': 'qwen-long', 'name': 'Qwen Long'},
    {'value': 'deepseek-r1', 'name': 'DeepSeek R1'},
  ];

  // 聊天风格选项 - 针对找对象场景，移除JSON模式
  final List<Map<String, String>> chatStyles = [
    {'emoji': '😊', 'title': '甜蜜撒娇'},
    {'emoji': '😌', 'title': '温柔体贴'},
    {'emoji': '🥰', 'title': '暧昧调情'},
    {'emoji': '😆', 'title': '幽默风趣'},
    {'emoji': '🤔', 'title': '聊天话题'},
    {'emoji': '😳', 'title': '害羞认错'},
    {'emoji': '💬', 'title': '正常聊天'},
  ];

  @override
  void onInit() {
    super.onInit();
    // 添加欢迎消息
    addMessage('你好！我是心动助手，准备好开始甜蜜的对话了吗？💕', false);
  }

  void addMessage(String content, bool isFromUser,
      {Map<String, dynamic>? jsonData, bool isJsonMessage = false}) {
    final message = ChatMessage(
      id: DateTime.now().millisecondsSinceEpoch.toString(),
      content: content,
      isFromUser: isFromUser,
      timestamp: DateTime.now(),
      jsonData: jsonData,
      isJsonMessage: isJsonMessage,
    );
    messages.add(message);
  }

  void selectTopic(String topic) {
    selectedTopic.value = topic;
  }

  void selectModel(String model) {
    selectedModel.value = model;
    // 可以添加模型切换的提示消息
    addMessage('已切换到模型：${getModelDisplayName(model)}', false);
  }

  String getModelDisplayName(String modelValue) {
    final model = availableModels.firstWhere(
      (m) => m['value'] == modelValue,
      orElse: () => {'value': modelValue, 'name': modelValue},
    );
    return model['name']!;
  }

  // 根据选择的模型生成专门的system prompt
  String getModelSpecificPrompt() {
    String basePrompt = '';

    switch (selectedModel.value) {
      case 'qwen-plus':
        basePrompt =
            '你是一个专业的恋爱聊天助手，擅长营造浪漫氛围，能够根据不同情况给出合适的约会建议和聊天技巧。你的回复既要有趣又要真诚，帮助用户建立良好的感情关系。';
        break;
      case 'qwen-turbo':
        basePrompt =
            '你是一个快速反应的恋爱顾问，能够迅速理解用户的情感需求，给出即时而精准的恋爱建议。你的回复简洁有力，直击要点，帮助用户在感情中更加自信。';
        break;
      case 'qwen-max':
        basePrompt =
            '你是一个资深的情感专家，拥有深厚的心理学知识和丰富的恋爱经验。你能够深入分析感情问题，提供专业而细致的恋爱指导，帮助用户建立健康长久的恋爱关系。';
        break;
      case 'qwen-long':
        basePrompt =
            '你是一个善于长篇交流的恋爱导师，擅长通过深入的对话来了解用户的情感状态。你会耐心倾听，给出详细的分析和建议，陪伴用户度过感情中的各种阶段。';
        break;
      case 'deepseek-r1':
        basePrompt =
            '你是一个理性而深刻的恋爱分析师，能够透过现象看本质，帮助用户理解恋爱中的深层心理机制。你的建议基于逻辑分析和情感洞察，助力用户做出明智的感情决策。';
        break;
      default:
        basePrompt = '你是一个专业的恋爱聊天助手，帮助用户在感情中获得更好的体验。';
    }

    return basePrompt;
  }

  // 根据选择的聊天风格生成system prompt
  String getSystemPrompt() {
    if (useJsonMode.value) {
      return '''${getModelSpecificPrompt()}
当前你需要以JSON模式回复，根据用户的消息生成3-5个直接的回复选项供用户选择。
这些选项应该是可以直接发送给对方的聊天内容，而不是建议。
请直接返回一个JSON数组，格式示例：["你今天过得怎么样呀？", "想你了～", "晚上一起看电影吧"]
请确保返回的是有效的JSON数组格式，不要包含其他内容。''';
    }

    String modelPrompt = getModelSpecificPrompt();
    String stylePrompt = '';

    switch (selectedTopic.value) {
      case '甜蜜撒娇':
        stylePrompt = '在回复时要表现得甜蜜可爱，使用撒娇的语气，多用"呀"、"哦"、"嘛"等可爱的语气词，让对话充满甜腻的恋爱氛围。';
        break;

      case '温柔体贴':
        stylePrompt = '要表现得温柔体贴，善解人意，用温和的语调关心对方的感受，给出贴心的建议，让对方感受到被呵护的温暖。';
        break;

      case '暧昧调情':
        stylePrompt = '要营造微妙的暧昧氛围，适度调情但不过分，使用一些暗示性的话语和emoji，让对话充满浪漫的张力。';
        break;

      case '幽默风趣':
        stylePrompt = '要表现得幽默风趣，善于制造轻松愉快的氛围，用幽默化解尴尬，让约会聊天变得有趣而难忘。';
        break;

      case '害羞认错':
        stylePrompt = '要表现得害羞可爱，在需要道歉或承认错误时，用可爱害羞的方式表达，让对方心软原谅。';
        break;

      case '正常聊天':
        stylePrompt = '保持自然真诚的聊天方式，既不过分热情也不过分冷淡，用正常的语气进行恋爱相关的交流。';
        break;

      default: // 聊天话题
        stylePrompt = '要善于提出有趣的恋爱话题，引导对话向深入的方向发展，帮助双方增进了解和感情。';
    }

    return modelPrompt + ' ' + stylePrompt;
  }

  Future<void> sendMessage(String message) async {
    if (message.trim().isEmpty) return;

    print(message);
    // 添加用户消息
    addMessage(message, true);
    inputText.value = '';

    // 显示加载状态
    isLoading.value = true;

    try {
      // 调用阿里云API
      String reply = await callDashscopeAPI(message);
      print('API调用成功，回复：$reply');
      // 如果是JSON模式，尝试解析JSON
      if (useJsonMode.value) {
        try {
          final jsonData = jsonDecode(reply);
          // 检查是否为数组格式
          if (jsonData is List) {
            addMessage('请选择回复内容：', false,
                jsonData: {'options': jsonData}, isJsonMessage: true);
          } else {
            // 如果不是数组，作为普通消息处理
            addMessage(reply, false);
          }
        } catch (e) {
          // 如果JSON解析失败，作为普通消息处理
          addMessage(reply, false);
        }
      } else {
        addMessage(reply, false);
      }
    } catch (e) {
      // API调用失败时使用本地回复
      String reply = generateLocalReply(message);
      if (useJsonMode.value) {
        try {
          final jsonData = jsonDecode(reply);
          if (jsonData is List) {
            addMessage('请选择回复内容：', false,
                jsonData: {'options': jsonData}, isJsonMessage: true);
          } else {
            addMessage(reply, false);
          }
        } catch (e) {
          addMessage(reply, false);
        }
      } else {
        addMessage(reply, false);
      }
      print('API调用失败: $e');
    }

    isLoading.value = false;
  }

  // 处理用户选择JSON选项
  void selectJsonOption(String optionText) {
    addMessage(optionText, true);

    // 可以根据选择继续对话
    Future.delayed(const Duration(milliseconds: 500), () {
      addMessage('已发送！对方会收到这条消息哦～😊', false);
    });
  }

  // 调用阿里云Dashscope API
  Future<String> callDashscopeAPI(String userMessage) async {
    try {
      final requestBody = {
        'model': selectedModel.value, // 使用选中的模型
        'messages': [
          {
            'role': 'system',
            'content': getSystemPrompt(),
          },
          {
            'role': 'user',
            'content': userMessage,
          }
        ],
      };

      // 如果是JSON模式，添加response_format参数
      if (useJsonMode.value) {
        requestBody['response_format'] = {'type': 'json_object'};
      }
      print(requestBody);
      final response = await http
          .post(
            Uri.parse(ApiConfig.dashscopeApiUrl),
            headers: {
              'Authorization': 'Bearer ${ApiConfig.dashscopeApiKey}',
              'Content-Type': 'application/json',
            },
            body: jsonEncode(requestBody),
          )
          .timeout(Duration(seconds: ApiConfig.timeoutSeconds));

      if (response.statusCode == 200) {
        final data = jsonDecode(response.body);
        return data['choices'][0]['message']['content'];
      } else {
        throw Exception('API调用失败: ${response.statusCode}');
      }
    } catch (e) {
      throw Exception('网络请求失败: $e');
    }
  }

  // 本地回复生成（当API不可用时使用）
  String generateLocalReply(String userMessage) {
    if (useJsonMode.value) {
      // JSON模式的本地回复 - 返回直接的聊天回复选项
      return jsonEncode(
          ["你今天过得怎么样呀？", "想你了～💕", "晚上一起看电影吧", "今天天气真好，想和你一起出去走走"]);
    }

    switch (selectedTopic.value) {
      case '甜蜜撒娇':
        return '哇塞！你说话好甜呀～人家都要被你撩到了呢💕 快告诉我更多嘛～';
      case '温柔体贴':
        return '嗯嗯，我能感受到你的真诚。恋爱中最重要的就是相互理解，你做得很好呢～';
      case '暧昧调情':
        return '你这样说话，会让人心跳加速的哦～😏 是想要更进一步了吗？';
      case '幽默风趣':
        return '哈哈，你真是太有趣了！和你聊天永远不会无聊，难怪会有人喜欢你呢😂';
      case '害羞认错':
        return '人家...人家刚才说错话了啦🙈 你不要生气嘛，我会乖乖听话的～';
      case '正常聊天':
        return '恋爱确实需要技巧呢，我可以给你一些建议。你现在最想了解什么方面的恋爱话题？';
      default: // 聊天话题
        return '要不我们聊聊你理想中的约会是什么样的？或者你最近有遇到心动的人吗？💕';
    }
  }

  void clearMessages() {
    messages.clear();
    addMessage('你好！我是心动助手，准备好开始甜蜜的对话了吗？💕', false);
  }
}
